package com.zijidelu.luframework.utils.spring.beans.register;

import java.util.Map;
import java.util.Optional;

/**
 * 动态Bean注册接口
 * 定义Spring动态Bean注册的核心功能
 *
 * @author ZIJIDELU
 * @datetime 2025/01/15 10:30
 */
public interface DynamicBeanRegister {

    /**
     * 注册简单 Bean
     *
     * @param beanName  Bean 名称
     * @param beanClass Bean 类型
     * @throws IllegalArgumentException 当参数无效时
     * @throws RuntimeException         当Bean已存在或注册失败时
     */
    void registerBean(String beanName, Class<?> beanClass);

    /**
     * 检查Bean是否已存在
     *
     * @param beanName Bean名称
     * @return 是否存在
     */
    boolean containsBean(String beanName);

    /**
     * 获取Bean实例（如果存在）
     *
     * @param beanName Bean名称
     * @return Bean实例，如果不存在返回null
     */
    Optional<?> getBeanIfExists(String beanName);

    /**
     * 获取指定类型的Bean实例
     *
     * @param beanName Bean名称
     * @param beanType Bean类型
     * @return Bean实例，如果不存在返回null
     */
    <T> Optional<T> getBeanIfExists(String beanName, Class<T> beanType);

    /**
     * 获取指定类型的Bean实例（如果存在）
     *
     * @param beanType Bean类型
     * @return bean实例
     */
    <T> Optional<T> getBeanIfExists(Class<T> beanType);

    /**
     * 获取指定类型的所有子类Bean实例
     *
     * @param beanType Bean类型
     * @return bean实例列表
     */
    <T> Map<String, T> getBeansOfType(Class<?> beanType);
}